import unittest

import json

"""
 @author adun
 @date 2020/11/5 22:43
 
 JSON 是用于存储和交换数据的语法。

JSON 是用 JavaScript 对象表示法（JavaScript object notation）编写的文本。
"""


class MyTestCase(unittest.TestCase):
    def test_something(self):
        self.assertEqual(True, False)

    # json->dictionary

    # 解析 JSON - 把 JSON 转换为 Python
    # 若有 JSON 字符串，则可以使用 json.loads() 方法对其进行解析。
    #
    # 结果将是 Python 字典。
    def test_json_to_dictionary(self):
        # 一些 JSON:
        # x = '{ "name":"Bill", "age":63, "city":"Seatle"}'
        x=str('{ "name":"Bill", "age":63, "city":"Seatle"}')

        # 解析json
        y=json.loads(x)

        # 结果是 Python 字典：
        print(y["age"])


    # 把 Python 转换为 JSON
    # 若有 Python 对象，则可以使用 json.dumps() 方法将其转换为 JSON 字符串。
    def test_dictionary_to_json(self):
        # Python 对象（字典）：
        # Python 对象（字典）：
        # x = {
        #     "name": "Bill",
        #     "age": 63,
        #     "city": "Seatle"
        # }
        x=dict(name="Bill",age=63,city="Seatle")

        # 转换为 JSON：
        y=json.dumps(x)
        print(type(y))
        print(type(y)==str)
        print(y)


    # 您可以把以下类型的 Python 对象转换为 JSON 字符串：
    #
    # dict
    # list
    # tuple
    # string
    # int
    # float
    # True
    # False
    # None
    def test_type_to_json(self):
        print(json.dumps({"name": "Bill", "age": 63}))# dict
        print(json.dumps(["apple", "bananas"]))# list
        print(json.dumps(("apple", "bananas")))# tuple
        print(json.dumps("hello"))# str
        print(json.dumps(42))# int
        print(json.dumps(31.76))# float
        print(json.dumps(True))# bool
        print(json.dumps(False))# bool
        print(json.dumps(None))


    # 转换包含所有合法数据类型的 Python 对象：
    def test_complex_json_to_python(self):
        x = {
            "name": "Bill",
            "age": 63,
            "married": True,
            "divorced": False,
            "children": ("Jennifer", "Rory", "Phoebe"),
            "pets": None,
            "cars": [
                {"model": "Porsche", "mpg": 38.2},
                {"model": "BMW M5", "mpg": 26.9}
            ]
        }

        print(json.dumps(x))

        # 上面的实例打印一个 JSON 字符串，但它不是很容易阅读，没有缩进和换行。
        #
        # json.dumps() 方法提供了令结果更易读的参数：
        #
        # 实例
        # 使用 indent 参数定义缩进数：
        print(json.dumps(x, indent=4))

        # 您还可以定义分隔符，默认值为（", ", ": "），这意味着使用逗号和空格分隔每个对象，使用冒号和空格将键与值分开：
        #
        # 实例
        # 使用 separators 参数来更改默认分隔符：
        print("===============================================")
        print(json.dumps(x, indent=4, separators=(". ", " = ")))

        # 对结果排序
        # json.dumps() 方法提供了对结果中的键进行排序的参数：
        #
        # 实例
        # 使用 sort_keys 参数来指定是否应对结果进行排序：
        # 按字母进行排序
        print("===============================================")
        print(json.dumps(x, indent=4, sort_keys=True))


if __name__ == '__main__':
    unittest.main()
